package interviewClassic150;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;

public class SpiralOrder {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        int m = matrix.length,n = matrix[0].length;
        int i = 0,j = 0;
        //4个方向
        int[][] dir = {{0,1},{1,0},{0,-1},{-1,0}};
        int curDirInd = 0;
        int left = 0,right = n - 1,bottom = m - 1,top = 0;
        while (left <= right && top <= bottom) {
            int cur = matrix[i][j];
            res.add(cur);
            if (curDirInd == 0 && j == right) {
                top++;
                curDirInd = (curDirInd + 1) % 4;
                i += dir[curDirInd][0];
                j += dir[curDirInd][1];
            } else if (curDirInd == 1 && i == bottom) {
                right--;
                curDirInd = (curDirInd + 1) % 4;
                i += dir[curDirInd][0];
                j += dir[curDirInd][1];
            } else if (curDirInd == 2 && j == left) {
                bottom--;
                curDirInd = (curDirInd + 1) % 4;
                i += dir[curDirInd][0];
                j += dir[curDirInd][1];
            } else if (curDirInd == 3 && i == top) {
                left++;
                curDirInd = (curDirInd + 1) % 4;
                i += dir[curDirInd][0];
                j += dir[curDirInd][1];
            } else {
                i += dir[curDirInd][0];
                j += dir[curDirInd][1];
            }
        }

        return res;
    }

    @Test
    public void test() {
        int[][] nums = {{1,2,3},{4,5,6},{7,8,9}};
        List<Integer> integers = spiralOrder(nums);
        System.out.println(integers);
    }
}
